#include "../sourse/server.hpp"

// void HandleClose(Channel* channel)
// {
//     std::cout << "close:" << channel->Fd() << std::endl;
//     DBG_LOG("close fd: %d", channel->Fd());
//     channel->Remove();
//     delete channel;
// }

// void HandleWrite(Channel* channel)
// {
//     int fd = channel->Fd();
//     const char* data = "hahah";
//     int ret = send(fd, data, strlen(data), 0);
//     if(ret < 0)
//     {
//         return HandleClose(channel);
//     }
//     channel->DisableWrite(); //关闭写监控
// }

// void HandleError(Channel* channel)
// {
//     return HandleClose(channel);
// }
// void HandleEvent(EventLoop* loop, Channel* channel, uint64_t timerid)
// {
//     loop->TimerRefresh(timerid);
// }
//管理所有的连接
std::unordered_map<uint64_t, PtrConnection> _conns;
uint64_t conn_id = 0;
EventLoop base_loop;
LoopThreadPool* loop_pool;
// std::vector<LoopThread> threads(2);
// int next_loop;
void ConnectionDestroy(const PtrConnection& conn)
{
    _conns.erase(conn->Id());
}

void OnConnected(const PtrConnection& conn)
{
    DBG_LOG("NEW CONNECTION: %p", conn.get());
}

void OnMessage(const PtrConnection& conn, Buffer* buf)
{
    DBG_LOG("%s", buf->ReadPosition());
    buf->MoveReadOffset(buf->ReadAbleSize());
    std::string str = "Hello World";
    conn->Send(str.c_str(), str.size());
    // int fd = channel->Fd();
    // char buf[1024] = {0};
    // int ret = recv(fd, buf, 1023, 0);
    // if(ret <= 0)
    // {
    //     return HandleClose(channel); //关闭释放
    // }
    // DBG_LOG("%s", buf);
    // std::cout << buf << std::endl;
    // channel->EnableWrite(); //启动可写事件
    //conn->Shutdown();

}
// void Acceptor(EventLoop* loop, Channel* lst_channel)
// {
//     int fd = lst_channel->Fd();
//     int newfd = accept(fd, NULL, NULL);
//     if(newfd < 0) {return; }
//     conn_id++;
//     PtrConnection conn(new Connection(loop, conn_id, newfd));
//     conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2)); //为通行套接字设置可读事件的回调函数
//     conn->SetSrvClosedCallback(std::bind(ConnectionDestroy, std::placeholders::_1));//关闭事件的回调函数
//     conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1));//错误事件的回调函数
//     // conn->SetAnyCallback(std::bind(HandleEvent, loop, conn, timerid));//任意事件的回调函数
//     //非活跃连接的超时释放操作，10s后关闭连接
//     //注意：定时销毁任务必须在启动读事件之前，因为有可能启动了事件监控后立即就有了事件，但是还没有任务
//     //loop->TimerAdd(timerid, 10, std::bind(HandleClose, conn));
//     //conn->EnableRead();
//     conn->EnableInactiveRelease(10); //启动非活跃超时销毁
//     conn->Established(); //就绪初始化
//     _conns.insert(std::make_pair(conn_id, conn));

// }

void NewConnection(int fd)
{
    conn_id++;
    //next_loop = (next_loop + 1) % 2;
    PtrConnection conn(new Connection(loop_pool->NextLoop(), conn_id, fd));
    conn->SetMessageCallback(std::bind(OnMessage, std::placeholders::_1, std::placeholders::_2)); //为通行套接字设置可读事件的回调函数
    conn->SetSrvClosedCallback(std::bind(ConnectionDestroy, std::placeholders::_1));//关闭事件的回调函数
    conn->SetConnectedCallback(std::bind(OnConnected, std::placeholders::_1));//错误事件的回调函数
    // conn->SetAnyCallback(std::bind(HandleEvent, loop, conn, timerid));//任意事件的回调函数
    //非活跃连接的超时释放操作，10s后关闭连接
    //注意：定时销毁任务必须在启动读事件之前，因为有可能启动了事件监控后立即就有了事件，但是还没有任务
    //loop->TimerAdd(timerid, 10, std::bind(HandleClose, conn));
    //conn->EnableRead();
    conn->EnableInactiveRelease(10); //启动非活跃超时销毁
    conn->Established(); //就绪初始化
    _conns.insert(std::make_pair(conn_id, conn));
    DBG_LOG("NEW---------------------");
}

int main()
{
    // srand(time(NULL));
    loop_pool = new LoopThreadPool(&base_loop);
    loop_pool->SetThreadCount(2);
    loop_pool->Create();
    Acceptor acceptor(&base_loop, 8500);
    acceptor.SetAcceptCallBack(std::bind(NewConnection, std::placeholders::_1));
    acceptor.Listen();
    base_loop.Start();

    // while(1)
    // {
    //     base_loop.Start();
    // }
    return 0;
}

// int main()
// {
//     srand(time(NULL));
//     EventLoop loop;
//     Socket lst_sock;
//     lst_sock.CreateServer(8500);
//     Channel channel(&loop, lst_sock.Fd());
//     channel.SetReadCallback(std::bind(Acceptor, &loop, &channel));
//     channel.EnableRead(); //启动可读事件监控
//     while(1)
//     {
//         loop.Start();
//         // std::vector<Channel*> actives;
//         // poller.Poll(&actives);
//         // for(auto& a : actives)
//         // {
//         //     a->HandleEvent();
//         // }
//         // int newfd = lst_sock.Accept();
//         // if(newfd < 0) 
//         // {
//         //     continue;
//         // }
//         // Socket cli_sock(newfd);
//         // char buf[1024] = {0};
//         // int ret = cli_sock.Recv(buf, 1023);
//         // if(ret < 0)
//         // {
//         //     cli_sock.Close();
//         //     continue;
//         // }
//         // cli_sock.Send(buf, ret);
//         // cli_sock.Close();
//     }
//     lst_sock.Close();
//     return 0;
    
// }